package 数组.排序算法;

import java.util.Arrays;

public class 插入排序 {
    public static void main(String[] args) {
        int[] sz = {1, 5, 9, 7, 5, 2, 8, 9};
        System.out.println(Arrays.toString(crpx(sz)));
//        insertSort(sz);
//        System.out.println(Arrays.toString(sz));
    }

    /**
     * 插入排序是一种最简单直观的排序算法，它的工作原理是通过构建有序序列，对于未排序数据，
     * 在已排序序列中从后向前扫描，找到相应位置并插入。
     * 算法步骤：
     * （1）将第一待排序序列第一个元素看做一个有序序列，把第二个元素到最后一个元素当成是未排序序列。
     * （2）从头到尾依次扫描未排序序列，将扫描到的每个元素插入有序序列的适当位置。
     * （如果待插入的元素与有序序列中的某个元素相等，则将待插入元素插入到相等元素的后面。）
     * @param sz
     * @return
     */
    public static int[] crpx(int[] sz) {
//        int[] cr = new int[sz.length];
//        cr[0] = sz[0];
        for (int i = 1; i < sz.length; i++) {
            int zz = sz[i];
            int j = i - 1;//用于控制选找插入数据位置的循环变量 同时也表示有序序列的长度
            for (; j >= 0; j--) {
                if (sz[j] > zz) {//数组操作的是地址的值（操作了就会变），所以这里是zz,不是sz[i]
                    sz[j + 1] = sz[j];//控制移动数据的位置
                }else {
                    break;
                }
            }
            sz[j+1] = zz;//插入数据

        }
        return sz;
    }
    public static void insertSort(int[] a) {
        int i, j, insertNote;// 要插入的数据
        for (i = 1; i < a.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
            insertNote = a[i];// 设置数组中的第2个元素为第一次循环要插入的数据
            j = i - 1;
            while (j >= 0 && insertNote < a[j]) {
                a[j + 1] = a[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
                j--;
            }
            a[j + 1] = insertNote;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
        }
    }
}
